package com.jkkc.lib.base.extend

import com.blankj.utilcode.util.GsonUtils

/**
 * Author:LiXian
 * <p>
 * Desc:集合扩展
 * Version:1.0
 * date 2023/2/28 16:18
 */

/**
 * 集合不为空判断
 */
fun Collection<*>?.isNotNullOrEmpty(): Boolean = !this.isNullOrEmpty()

/**
 * 获取集合或者Null，字符串不为空，返回自己，为空，返回Null
 */
fun <T> Collection<T>?.getListOrNull(): Collection<T>? = this.takeIf { it.isNotNullOrEmpty() }

/**
 * 获取集合，集合为空创建集合
 */
fun <T> List<T>?.getList(): MutableList<T> = if (this.isNotNullOrEmpty()) this!!.toMutableList() else mutableListOf()


fun <T> List<T>?.forEachOrNull(action: (T) -> Unit) {
    if (isNotNullOrEmpty()) {
        this!!.forEach { action.invoke(it) }
    }
}

/**
 * 根据条件过滤，获取新的集合
 */
fun <T> Collection<T>.filter(mapper: (T) -> Boolean): MutableList<T> {
    val mList: MutableList<T> = mutableListOf()
    this.forEach {
        if (mapper(it)) {
            mList.add(it)
        }
    }
    return mList
}

/**
 * 有一次匹配成功，就返回true，否则false
 */
fun <T> Collection<T>?.anyMatch(action: (T) -> Boolean): Boolean {
    if (this.isNullOrEmpty()) return false
    for (t in this) {
        if (action.invoke(t)) {
            return true
        }
    }
    return false
}

/**
 * List转Json
 */
fun List<*>?.listToJson(): String {
    return getListOrNull()?.let { GsonUtils.toJson(it) } ?: ""
}

/**
 * 有一次匹配成功，就返回实例，否则返回null
 */
fun <T> Collection<T>?.match(action: (T) -> Boolean): T? {
    if (this.isNullOrEmpty()) return null
    for (t in this) {
        if (action.invoke(t)) {
            return t
        }
    }
    return null
}

/**
 * 有一次匹配成功，返回对象
 */
fun <T> Collection<T>?.anyMatchOrNull(action: (T) -> Boolean): T? {
    if (this.isNullOrEmpty()) return null
    for (t in this) {
        if (action.invoke(t)) {
            return t
        }
    }
    return null
}